//
// Description: STL之is_sorted()与is_sorted_until()使用
// Created by Loading on 2021/5/30.
//

#include <bits/stdc++.h>

using namespace std;

//自定义排序规则
bool myCmp(int i, int j) {
    return i > j;
}

int main() {
    vector<int> vec1 = {3, 1, 2, 4};
    vector<int> vec2 = {1, 2, 3, 4};
    vector<int> vec3 = {4, 3, 2, 1};
    /* is_sorted()，检测序列是否已按指定排序规则排序，默认规则为升序 */
    //默认升序检测
    if (is_sorted(vec1.begin(), vec1.end())) {
        cout << "vec1已升序排列" << endl;
    } else {
        cout << "vec1未升序排列" << endl;
    }
    if (is_sorted(vec2.begin(), vec2.end())) {
        cout << "vec2已升序排列" << endl;
    } else {
        cout << "vec2未升序排列" << endl;
    }

    //自定义排序方法检测
    if (is_sorted(vec2.begin(), vec2.end(), myCmp)) {
        cout << "vec2已按自定义排序规则排序" << endl;
    } else {
        cout << "vec2未按自定义排序规则排序" << endl;
    }
    if (is_sorted(vec3.begin(), vec3.end(), myCmp)) {
        cout << "vec3已按自定义排序规则排序" << endl;
    } else {
        cout << "vec3未按自定义排序规则排序" << endl;
    }

    /*
     * 和 is_sorted() 函数相比，is_sorted_until() 函数不仅能检测出某个序列是否有序，还会返回一个正向迭代器，
     * 该迭代器指向的是当前序列中第一个破坏有序状态的元素。
     */
    //默认升序
    auto iter = is_sorted_until(vec1.begin(), vec1.end());
    if (iter != vec1.end()){
        cout << "第一个破坏有序状态的元素是：" << *iter << endl;
    }else{
        cout << "vec1已升序排列" << endl;
    }

    //自定义排序规则
    auto iter2 = is_sorted_until(vec1.begin(), vec1.end(), myCmp);
    if (iter2 != vec1.end()){
        cout << "第一个破坏有序状态的元素是：" << *iter2 << endl;
    }else{
        cout << "vec1已按自定义排序规则排序" << endl;
    }
}